import axios from 'axios'

// 创建 axios 实例
const service = axios.create({
  baseURL: 'http://192.168.1.164:4590/api/', // 从环境变量获取基础 API 地址
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    const token = localStorage.getItem('token')
    const expiresIn = localStorage.getItem('expiresIn')
    if (token && expiresIn && (expiresIn > new Date().getTime())) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  error => {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 对响应数据做点什么
    const res = response.data
    if (res.message) {
      ElMessage({
        message: res.message,
        type: 'success',
        duration: 5 * 1000
      })
    }
    return res
  },
  error => {
    // 对响应错误做点什么
    if (error.response) {
      if (error.response.status == 401) {
        ElMessageBox.confirm('登录状态已过期，请重新登录', '系统提示', {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          localStorage.removeItem('token')
          window.location.href = '/'
        })
      }
    } else if (error.message.includes('timeout')) {
      error.message = '请求超时'
    } else if (error.message === 'Network Error') {
      error.message = '网络错误，请检查网络连接'
    }
    ElMessage({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

/**
 * GET 请求
 * @param {string} url 请求地址
 * @param {object} params 请求参数
 * @param {object} config 额外配置
 */
export function get(url, params = {}, config = {}) {
  return service({
    method: 'get',
    url,
    params,
    ...config
  })
}

/**
 * POST 请求
 * @param {string} url 请求地址
 * @param {object} data 请求体数据
 * @param {object} config 额外配置
 */
export function post(url, data = {}, config = {}) {
  return service({
    method: 'post',
    url,
    data,
    ...config
  })
}

/**
 * PUT 请求
 * @param {string} url 请求地址
 * @param {object} data 请求体数据
 * @param {object} config 额外配置
 */
export function put(url, data = {}, config = {}) {
  return service({
    method: 'put',
    url,
    data,
    ...config
  })
}

/**
 * DELETE 请求
 * @param {string} url 请求地址
 * @param {object} params 请求参数
 * @param {object} config 额外配置
 */
export function del(url, params = {}, config = {}) {
  return service({
    method: 'delete',
    url,
    params,
    ...config
  })
}

/**
 * 文件上传
 * @param {string} url 请求地址
 * @param {FormData} formData 表单数据
 * @param {function} onUploadProgress 上传进度回调
 * @param {object} config 额外配置
 */
export function upload(url, formData, onUploadProgress = null, config = {}) {
  return service({
    method: 'post',
    url,
    data: formData,
    headers: {
      'Content-Type': 'multipart/form-data'
    },
    onUploadProgress,
    ...config
  })
}

/**
 * 文件下载
 * @param {string} url 请求地址
 * @param {object} params 请求参数
 * @param {string} filename 下载文件名
 */
export function download(url, params = {}, filename = 'file') {
  return service({
    method: 'get',
    url,
    params,
    responseType: 'blob'
  }).then(response => {
    const blob = new Blob([response.data])
    const downloadUrl = window.URL.createObjectURL(blob)
    const link = document.createElement('a')
    link.href = downloadUrl
    link.download = filename
    document.body.appendChild(link)
    link.click()
    window.URL.revokeObjectURL(downloadUrl)
    document.body.removeChild(link)
  })
}

export default service